﻿using Didsoft.DUA.AccesoDatos.Contratos;
using Didsoft.DUA.AccesoDatos.Entidades;
using Didsoft.DUA.Negocios;
using Didsoft.Mvc.Security;
using SIOGDE.AccesoDatos.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIOGDE.Negocios.Global
{
    public class Session : Didsoft.Mvc.Security.ISessionContext<object>
    {
        public void CleanTempData(object UserInfo, string sessionKey)
        {
            
        }

        public void DeleteSession(object UserInfo, string sessionKey)
        {
            
        }

        public void InitializeSession(object UserInfo, string sessionKey)
        {
            IDUA_SesionUsuarioAccesoDatos sesionAD = DataFactory.Current.GetDUA_SesionUsuarioAccesoDatos();
            var usuario = (DUA_Usuario)UserInfo;
            
            var sesion = new DUA_SesionUsuario()
            {
                FechaPrimerAcceso = SessionContext<object>.DateStarted,
                IP = SessionContext<object>.IP,
                LlaveSesion = SessionContext<object>.SessionKey,
                Navegador = SessionContext<object>.Navigator,
                Usuario = (DUA_Usuario)UserInfo
            };
            sesionAD.Insert(sesion);

            IDUA_HistorialSesionAccesoDatos historialAD = DataFactory.Current.GetDUA_HistorialSesionAccesoDatos();
            DUA_HistorialSesion historial = new DUA_HistorialSesion()
            {
                Accion = "Index",
                Controlador = "Menu",
                Parametros = "",
                FechaAcceso = DateTime.Now,
                URL = "",
                Descripcion = "Inicio de Sesion",
                SesionUsuario = sesion
            };
            historialAD.Insert(historial);
        }

        public bool IsAuthorizedAction(string controller, string action)
        {
            var user = Session.UserInfo;
            IDUA_RolAccesoAccesoDatos rolAccesoAD = DataFactory.Current.GetDUA_RolAccesoAccesoDatos();            
            var result = rolAccesoAD.TieneAcceso(user.Rol.Id, controller, action);

            //comentar esto cuando ya se haya registrado todos los privilegios de usuario
            string userEnablesPermission = System.Configuration.ConfigurationManager.AppSettings["UserEnablesPermission"];
            if (!string.IsNullOrEmpty(userEnablesPermission) && user.Nombre.Equals(userEnablesPermission))
            {
                //acceso maestro el controller 
                IDUA_AccesoMaestroAccesoDatos amaestrodata = DataFactory.Current.GetDUA_AccesoMaestroAccesoDatos();
                DUA_AccesoMaestro maestro = amaestrodata.BuscarPorControlador(controller);

                if (maestro == null)
                {
                    maestro = new DUA_AccesoMaestro();
                    maestro.Controlador = controller;
                    maestro.Guid = Guid.NewGuid().ToString();
                    maestro.Nombre = controller.Substring(controller.LastIndexOf('.') + 1);
                    maestro.NombreAplicacion = "SIPRE";                    
                    maestro.UrlImagen = "../../Content/Images/Menu/home.png";
                    amaestrodata.Insert(maestro);
                }


                //buscando accesos de acuerdo a la accion del controlador
                IDUA_AccesoAccesoDatos aaccesoData = DataFactory.Current.GetDUA_AccesoAccesoDatos();
                DUA_Acceso acceso = aaccesoData.BuscarPorAccion(controller, action);
                if (acceso == null)
                {
                    acceso = new DUA_Acceso();
                    acceso.AccesoMaestro = maestro;
                    acceso.Accion = action;
                    acceso.Descripcion = "Generado Automaticamente";
                    acceso.Guid = Guid.NewGuid().ToString();
                    acceso.MostrarEnMenu = false;
                    acceso.Nombre = "Acceso - " + action;
                    aaccesoData.Insert(acceso);
                }
                //ahora agarramos el acceso y asignamos a los roles


                //buscar si el rol tiene el acceso disponible
                DUA_RolAcceso rolAcceso = rolAccesoAD.BuscarPorRolYAcceso(user.Rol.Id, acceso.Id);
                if (rolAcceso == null)
                {
                    rolAcceso = new DUA_RolAcceso();
                    rolAcceso.Acceso = acceso;
                    rolAcceso.Escritura = true;
                    rolAcceso.FechaCaducidad = DateTime.Now.AddYears(1);
                    rolAcceso.FechaCreacion = DateTime.Now;
                    rolAcceso.Lectura = true;
                    rolAcceso.Params = "Generado Automaticamente";
                    rolAcceso.Rol = user.Rol;
                    rolAccesoAD.Insert(rolAcceso);
                }
            }

            return result;
        }

        public void PersistSessionAction(object userinfo, string SessionKey, string controller, string action, string parameters)
        {
            DUA_SesionUsuarioNegocios negocios = new DUA_SesionUsuarioNegocios();
            DUA_SesionUsuario sesionusuario = new DUA_SesionUsuario()
            {
                FechaPrimerAcceso = SessionContext<DTOUsuario>.DateStarted,
                IP = SessionContext<DTOUsuario>.IP,
                LlaveSesion = SessionContext<DTOUsuario>.SessionKey,
                Navegador = SessionContext<DTOUsuario>.Navigator,
                Usuario = (DTOUsuario)userinfo
            };

            negocios.PersistirSesion(sesionusuario, controller, action, parameters);
        }

        public void PersistSessionAction(string action, string parameters)
        {
            
        }

        public void PersistSessionAction(object UserInfo, string sessionKey)
        {
            
        }

        public static DTOUsuario UserInfo
        {
            get { return (DTOUsuario)SessionContext<object>.UserInfo; }
        }

        public static Gestion GestionActiva
        {
            get
            {
                return (Gestion)SessionContext<object>.PeriodTag;
            }
        }

        public static DestinoAsignado DestinoActual
        {
            get { return SessionContext<DTOUsuario>.UserInfo.DestinoActual; }
        }

    }
}
